package org.jsola.contract.web;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.jsola.contract.dto.CategoryAddDTO;
import org.jsola.contract.dto.CategoryBatchDTO;
import org.jsola.contract.dto.CategoryUpdateDTO;
import org.jsola.contract.dto.IssuedCategoryAddDTO;
import org.jsola.contract.query.CategoryQuery;
import org.jsola.contract.vo.CategoryListVO;
import org.jsola.contract.vo.CategoryVO;
import org.jsola.contract.vo.ContractGroupListVO;
import org.jsola.core.Page;
import org.jsola.core.Result;
import org.springframework.web.bind.annotation.RequestBody;

import javax.validation.Valid;
import java.util.List;

/**
 * 合同类型
 *
 * @author JanusMix
 */
@Api(tags = "contract-合同类型")
public interface ICategoryControllerAPI {

    /**
     * 新增合同类型
     *
     * @param categoryAddDTO 合同类型新增实体
     * @return 合同类型展示对象
     */
    @ApiOperation(value = "新增合同类型")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "categoryAddDTO", dataType = "CategoryAddDTO", value = "新增合同类型", paramType = "body")
    })
    Result<CategoryVO> save(CategoryAddDTO categoryAddDTO);


    /**
     * 修改合同类型
     *
     * @param categoryUpdateDTO 合同类型
     * @return 更新数量
     */
    @ApiOperation(value = "修改合同类型")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "categoryUpdateDTO", dataType = "CategoryUpdateDTO", value = "修改合同类型", paramType = "body")
    })
    Result<Integer> update(CategoryUpdateDTO categoryUpdateDTO);

    /**
     * 批量编辑、新增、删除合同类型
     *
     * @param categoryBatchDTO 要操作的合同类型
     * @return 操作之后的全部合同类型
     */
    @ApiOperation(value = "批量编辑、新增、删除合同类型")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "categoryBatchDTO", dataType = "CategoryBatchDTO", value = "要操作的字段数据", paramType = "body")
    })
    Result batch(CategoryBatchDTO categoryBatchDTO);


    /**
     * 删除单个合同类型，彻底删除
     *
     * @param categoryId 合同类型id
     * @return 删除数量
     */
    @ApiOperation(value = "删除单个合同类型，彻底删除")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "categoryId", dataType = "Long", value = "合同类型id", paramType = "path")
    })
    Result<Integer> delete(Long categoryId);


    /**
     * 批量删除合同类型，彻底删除
     *
     * @param categoryIds 合同类型id集合
     * @return 删除数量
     */
    @ApiOperation(value = "批量删除合同类型，彻底删除")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "categoryIds", dataType = "Long[]", value = "合同类型id数组", paramType = "body", allowMultiple = true)
    })
    Result<Integer> deleteBatch(Long[] categoryIds);


    /**
     * 根据合同类型id查询合同类型详情
     *
     * @param categoryId 合同类型id
     * @return 合同类型详情
     */
    @ApiOperation(value = "根据合同类型id查询合同类型详情")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "categoryId", dataType = "Long", value = "合同类型id", paramType = "path")
    })
    Result<CategoryVO> findById(Long categoryId);


    /**
     * 查询合同类型
     *
     * @param categoryQuery 合同类型查询参数
     * @return page
     */
    @ApiOperation(value = "查询合同类型")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "categoryQuery", dataType = "CategoryQuery", value = "合同类型查询参数", paramType = "query")
    })
    Result<List<CategoryListVO>> listAll(CategoryQuery categoryQuery);

    /**
     * 查询公司下合同类型（分组-类型 树形展示）
     *
     * @param subjectId 业务id(目前指公司id)
     * @param name      筛选姓名
     * @return 公司下合同类型（分组-类型 树形展示）
     */
    @ApiOperation(value = "查询公司下合同类型（分组-类型 树形展示）")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "subjectId", dataType = "String", value = "查询公司下合同类型（分组-类型 树形展示）", paramType = "query"),
            @ApiImplicitParam(name = "name", dataType = "String", value = "筛选姓名", paramType = "query")
    })
    Result<List<ContractGroupListVO>> selectTreeBySubjectId(String subjectId, String name);


    /**
     * 分页查询合同类型
     *
     * @param categoryQuery 合同类型查询参数
     * @return page
     */
    @ApiOperation(value = "分页查询合同类型")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "categoryQuery", dataType = "CategoryQuery", value = "合同类型查询参数", paramType = "query")
    })
    Result<Page<CategoryListVO>> page(CategoryQuery categoryQuery);


    /**
     * 下发合同模版到公司
     *
     * @param issuedCategoryAddDTO 合同模版
     * @return 合同类型
     */
    @ApiOperation(value = "下发合同模版到公司")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "issuedCategoryAddDTO", dataType = "IssuedCategoryAddDTO", value = "合同模版", paramType = "body")
    })
    Result<List<CategoryVO>> saveIssuedCategory(IssuedCategoryAddDTO issuedCategoryAddDTO);

    /**
     * 根据合同类型id查询合同是否可以发起
     *
     * @param categoryId 合同类型id
     * @return 合同类型详情
     */
    @ApiOperation(value = "根据合同类型id查询合同是否可以发起")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "categoryId", dataType = "Long", value = "合同类型id", paramType = "path")
    })
    Result<String> checkTemplateByCategoryId(Long categoryId);

}

